#include <iostream>
#include <future>
#include <memory>


// 使⽤std::packaged_task和std::future配合
// std::packaged_task就是将任务和 std::feature 绑定在⼀起的模板，是⼀种对任务的封装。我们可以通
// 过std::packaged_task对象获取任务相关联的std::feature对象，通过调⽤get_future()⽅法获得。
// std::packaged_task的模板参数是函数签名。
// 可以把std::future和std::async看成是分开的， ⽽ std::packaged_task则是⼀个整体。

int Add(int num1,int num2)
{
    std::cout<<"into add"<<std::endl;
    return num1+num2;
}

// int main()
// {
//     std::packaged_task<int(int,int)> task(Add);//封装任务
//     std::future<int> res = task.get_future();//获取任务包关联的future对象
//     task(11,22);//执行任务
//     std::cout<<res.get()<<std::endl;//获取结果
//     return 0;
// }

int main()
{
    // auto task = std::make_shared<std::packaged_task<int(int,int)>>(Add);
    // std::future<int> res = task->get_future();
    // //创建线程
    // std::thread thr([task]()
    // {
    //     (*task)(11,22);
    // });
    // std::cout<<res.get()<<std::endl;
    // thr.join();
    std::packaged_task<int(int,int)> task(Add);
    std::future<int> res = task.get_future();
    std::thread thr([&task]()
    {
        task(11,22);
    });
    std::cout<<res.get()<<std::endl;
    thr.join();
    return 0;
}